#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iostream>
#include <hashtable.h>

int main(int argc, char const *argv[])
{
    std::set<long long> set1;
    set1.insert(1);
    set1.insert(2);
    set1.insert(3);
    set1.insert(4);
    set1.insert(5);
    auto it = set1.begin();
    it++;
    std::cout << "sizeof(std::set<long long>):" << sizeof(set1) << std::endl;

    //========================================  std::map  ========================================

    std::map<long, long> map1;
    std::cout << "sizeof(std::map<long, long>):" << sizeof(map1) << std::endl;

    //========================================  std::unordered_map  ========================================

    std::unordered_map<long, long> unordered_map1;
    std::cout << "sizeof(std::unordered_map<long, long>):" << sizeof(unordered_map1) << std::endl;

    //========================================  std::unordered_set  ========================================

    std::unordered_set<long> unordered_set1;
    std::cout << std::hex << "sizeof(std::unordered_set<long>): 0x" << sizeof(unordered_set1) << std::endl;
    std::cout << std::hex << "sizeof(unordered_set1._M_h): 0x" << sizeof(unordered_set1._M_h) << std::endl;
    // std::cout << std::hex << "sizeof(unordered_set1._M_h._M_before_begin): 0x" << sizeof(unordered_set1._M_h._M_before_begin) << std::endl;
    // std::cout << std::hex << "sizeof(unordered_set1._M_h._M_rehash_policy): 0x" << sizeof(unordered_set1._M_h._M_rehash_policy) << std::endl;
    //========================================  std::hashmap  ========================================
    // std::_Hashtable<long,hash<long>,> hashtable1;

    // <typename _Value,
    //    typename _Hash = hash<_Value>,
    //    typename _Pred = std::equal_to<_Value>,
    //    typename _Alloc = std::allocator<_Value>,
    //    typename _Tr = __uset_traits<__cache_default<_Value, _Hash>::value>>
}
